home *** CD-ROM | disk | FTP | other *** search
/ The Best of MacTutor - S…e Code for Volumes 1 to 5 / The Best of MacTutor - Source Code for Volume 1-5 (Wayzata Technology)(6031)(1990).bin / Source Code / #45 (Jun 89) / abC Text File
Text File  |  1989-05-11  |  5KB  |  225 lines

  1. /*windowhelp.h */
  2. #include "TextEdit.h"
  3.     
  4. #ifndef WINDOWHELP_H
  5. #define WINDOWHELP_H
  6.  
  7. /* window add-on structure */
  8.  
  9. #define    WindowStruct    struct w_struct
  10. WindowStruct
  11.     {
  12.     WindowRecord    wr;            /* the original window record */
  13.     uchar            mtop;            /* margin indents */
  14.     uchar            mleft;
  15.     uchar            mbottom;
  16.     uchar            mright;
  17.     Rect            cursrt;        /* rectangle used for cursor control */
  18.     Rect            zoomrt;        /* rectangle for zoom operation */
  19.     char            mouser;        /* mouse pointer id (cursor shape) */
  20.     char            changed;        /*if window contents havebeen changed */
  21.     short            ckind;        /* kind of contents */
  22.     TEHandle        curtext;        /* handle to current text record for window */
  23.     };
  24.     
  25.  
  26. #define    Woffset        18
  27. #define    SBarWidth        15
  28.  
  29. /* these definitions allow easy generation of the four square
  30.  *    cornered titled windows. The basic (simplest) window is the
  31.  *    WDOC (NoGrowDocProc). To this optionally add WGROW to add a 
  32.  *    grow box and/or WZOOM to add a zoom box.
  33.  */
  34. #define    WDOC        4
  35. #define    WGROW        -4
  36. #define    WZOOM        8
  37. #define    WVBAR        16
  38. #define    WHBAR        32
  39.  
  40. /* specify the content of the window */
  41. #define    CDRAW        1
  42. #define    CTEXT        2
  43.  
  44. /* Value placed in windowKind field of WindowRecord by WindowNew
  45.  * if the window has a grow box. This is used by routines that
  46.  * redraw the window to decide whether to draw the grow box
  47.  * or not 
  48.  */
  49. #define    HASGROW        9
  50.  
  51. #endif
  52.  
  53. WindowHelp.c
  54.  
  55.  
  56. /* windowhelp.c
  57.  *        provides some routines to aid in opening and closing 
  58.  *        windows
  59.  */
  60.  
  61. #include    "abc.h"
  62. #include    "Quickdraw.h"
  63. #include    "EventMgr.h"
  64. #include    "WindowMgr.h"
  65. #include    "MenuMgr.h"
  66. #include    "windowhelp.h" 
  67. #include    "controlhelp.h"
  68. #include    "cursorhelp.h"
  69.  
  70. short    w_total = 0;    /* counts total number of windows opened*/
  71. short    w_count    = 0;    
  72.     /* counts number of windows actually open */
  73.  
  74. WindowNew(title,percentsz,windkind,contkind)
  75.     char    *title;
  76.     short    percentsz;
  77.     short    windkind;
  78.     short    contkind;
  79. {
  80.     char            *thetitle;
  81.     Rect            boundsrt;
  82.     WindowRecord    *w;
  83.     WindowStruct    *ws;
  84.     short            width;
  85.     short            depth;
  86.     short            leftedge;
  87.     short            topedge;
  88.     Rect            pagesz;
  89.     short            hasscroll;
  90.     
  91.     hasscroll = windkind & WVBAR + WHBAR;    
  92.         /* mask out scroll bar options */
  93.     windkind &= 8;
  94.     if (title)
  95.         thetitle = title;
  96.     else
  97.         thetitle = "Untitled";
  98.     SetRect(&boundsrt,    screenBits.bounds.left + 4,
  99.                         screenBits.bounds.top + 24,
  100.                         screenBits.bounds.right - 4,
  101.                         screenBits.bounds.bottom - 4);
  102.     width = boundsrt.right - boundsrt.left;
  103.     depth = boundsrt.bottom - boundsrt.top;
  104.     AdjustRect(&boundsrt,
  105.             topedge = 30 + Woffset * w_total,
  106.             leftedge = 30 + Woffset * w_total,
  107.             ((depth * percentsz) / 100) - topedge,
  108.             ((width * percentsz) / 100) - leftedge);
  109.     ws = (WindowStruct *)NewPtr(sizeof (WindowStruct));
  110.     w = (WindowRecord *)NewWindow(ws,&boundsrt,CtoPstr(thetitle),True,
  111.                             windkind,(WindowPtr)-1,True,0);
  112.     ws = (WindowStruct *)w;
  113.     switch (windkind)
  114.         {
  115.         case documentProc : 
  116.         case zoomDocProc :    
  117.                     w->windowKind = HASGROW;
  118.                     break;
  119.         };
  120.     if (w->windowKind == HASGROW)  /* set window margins */
  121.         {
  122.         ws->mright = ws->mbottom = SBarWidth;
  123.         AppPage(&pagesz);
  124.         if (hasscroll == WHBAR)
  125.             ScrollNew(w,0,0,pagesz.right,HORZ);
  126.         if (hasscroll == WVBAR)
  127.             ScrollNew(w,0,0,pagesz.bottom,VERT);
  128.         DrawControls(w);
  129.         DrawGrowIcon(w);
  130.         }
  131.     else
  132.         ws->mright = ws->mbottom = 0;
  133.     ws->mtop = ws->mleft = 0;
  134.     ws->changed = FALSE;
  135.     ws->ckind = contkind;
  136.     ws->curtext = NIL;
  137.     SetCursorRect(w);    /* set the cursor rectangle for cursor control */
  138.     AppNew(w);            /* function to open application structure */
  139.     w_count++;
  140.     w_total++;
  141.     PtoCstr(thetitle);
  142. }
  143.  
  144. /* WindowClose()
  145.  *    Closes the window passed to it. Assumes window was opened 
  146.  * with WindowNew(). If the window is a desk accessory, it will 
  147.  *     be closed correctly. If it is an application window, prior 
  148.  *     to the window close there is a call to AppClose() (which 
  149.  * the application must supply) to allow any application 
  150.  * specific closing.
  151.  */
  152. WindowClose(w)
  153.     WindowRecord    *w;
  154. {
  155.     WindowStruct    *ws;
  156.     short            refnum;
  157.     
  158.     if (ws = (WindowStruct *)w)
  159.         if ((refnum = w->windowKind) < 0)
  160.             CloseDeskAcc(refnum);
  161.         else 
  162.             {
  163.             AppClose(w);        /* close app storage, must do before */
  164.               CloseWindow(w);        /*    CloseWindow */
  165.               DisposPtr(w);
  166.               w_count--;            /* decrement the window count */
  167.               if (w_count == 0)    
  168.             /* if the number of windows on screen goes to */
  169.                   w_total = 0;        
  170.                 /*  zero, set total to zero so next time we */
  171.               }        /* open a window it will start at the original */
  172. }                                    /*   window position */
  173.  
  174. /* AdjustRect
  175.  *        adjusts coordinates of a rectangle by four separate 
  176.  *        amounts. adjustment is in (towards center) if amounts are 
  177.  *        positive and out if amounts are negative);
  178.  */
  179. AdjustRect(rec,t,l,b,r)
  180.     Rect    *rec;
  181.     short    t,l,b,r; /* values to adjust rectangle by */
  182. {
  183.     rec->top +=t;
  184.     rec->left += l;
  185.     rec->bottom -= b;
  186.     rec->right -= r;
  187. }
  188.  
  189. /* RtGlobalToLocal
  190.  *        Adjusts a rectangle to local coordinates
  191.  */
  192. RtGlobalToLocal(rt)
  193.     Rect    *rt;
  194. {
  195.     Point    *pt;
  196.     
  197.     pt = (Point *)rt;
  198.     GlobalToLocal(pt);
  199.     pt++;
  200.     GlobalToLocal(pt);
  201. }
  202.  
  203.  
  204.  
  205. dofile(item)
  206.     short    item;
  207. {
  208.     WindowRecord    *w;
  209.     
  210.     switch(item)
  211.         {
  212.         case iNew    : WindowNew("",40,WDOC+WGROW+WVBAR,CTEXT);
  213.                       break;
  214.         case iClose    : WindowClose(FrontWindow());
  215.                       break;
  216.         case iQuit    : while (w = (WindowRecord *)FrontWindow() )
  217.                         {
  218.                         WindowClose(w);
  219.                         }
  220.                       ExitToShell();
  221.                       break;
  222.         }
  223. }
  224.  
  225.